//
//  Metronome.m
//  Metronome
//
//  Created by Thomas Dupont on 23/09/09.
//  Copyright 2009 Greenteam. All rights reserved.
//

#import "Metronome.h"
#import "CocoaClavier.h"
#import "CocoaMolette.h"
#import "CocoaAfficheur.h"
#import "GestionnaireEvenements.h"
#import "CommandeCheck.h"
#import "MoteurController.h"
#import "Horloge.h"
#import "Moteur.h"
#import "CommandeFire.h"
#import "CommandeEteindre.h"
#import "CocoaEmetteurSonore.h"
#import "Materiel.h"
#import "MetronomeView.h"

@implementation Metronome

#pragma mark -
#pragma mark Memory Management
- (void)dealloc
{
	[facadeIHM release];
	[super dealloc];
}

- (void)awakeFromNib
{
	// Inialisation de la vue
	NSView* metronomeView = [[MetronomeView alloc] init];
	[self.window.contentView addSubview:metronomeView];
	
	// Initialiser la partie IHM
	facadeIHM = [GestionnaireEvenements new];
	MoteurController* controller = [MoteurController new];
	id<CommandProtocol> commandCheck = [CommandeCheck new];
	[(CommandeCheck*)commandCheck setGestionnaireEvenements:facadeIHM];
	[facadeIHM setController:controller];
	
	
	// Initialiser le moteur
	Moteur* moteur = [[Moteur alloc] init];
	[moteur setController:controller];
	id<CommandProtocol> commandeFire = [CommandeFire new];
	[moteur setCommandFire:commandeFire];
	[(CommandeFire*)commandeFire setMoteur:moteur];
	
	id<AfficheurProtocol> afficheur = [[Materiel sharedMateriel] afficheur]; 
	id<CommandProtocol> commandeLED1 = [[CommandeEteindre alloc] initWithLED:1];
	id<CommandProtocol> commandeLED2 = [[CommandeEteindre alloc] initWithLED:2];
	[(CommandeEteindre*)commandeLED1 setAfficheur:afficheur];
	[(CommandeEteindre*)commandeLED2 setAfficheur:afficheur];
	
	[controller setMonMoteur:moteur];
	[controller setCommandeLED1:commandeLED1];
	[controller setCommandeLED2:commandeLED2];
	
	[afficheur afficherTempo:[moteur tempo]];
	[afficheur afficherMesure:[moteur nbTempsParMesure]];
	
	// Demarrage de la recuperation des evenements
	[[[Materiel sharedMateriel] horloge] activerCommande:commandCheck periodiquement:0.01];
	
	[(id)commandeLED1 release];
	[(id)commandeLED2 release];
	[(id)commandeFire release];
	[(id)commandCheck release];
	[moteur release];
	[controller release];
}

@end
